﻿using M.Entities;
using M.EntityConfigurations;
using M.Extensions;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace M
{
    public class OneToOneContext : DbContext
    {
        public DbSet<Player> Player { get; set; }
        public DbSet<Resume> Resume { get; set; }

        public OneToOneContext(DbContextOptions<OneToOneContext> options)
        : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // 这个方法放在最前，或者最后，效果似乎一样
            base.OnModelCreating(modelBuilder);

            // 引入单个Configuration
            modelBuilder.ApplyConfiguration(new PlayerConfiguration());

            // 自动加载该项目下的所有IEntityTypeConfiguration约束
            // 引入约束的同时，也会将实体信息引入。即使没有在DbContext中以DbSet引入实体，也会被引入
            //modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);

            // 最后改名字的这类的代码，放到最后，等到所有约束都生效后，再调用该方法。
            modelBuilder.TableMappingTo(
                e => { return true; }, // 校验是否处理名称
                e => { return e.ToLower(); },
                e => { return e.ToLower(); }
            );


            // 修改字符串类型的默认长度
            // string类型的字段如果没有配置MaxLength，则默认添加256长度限制
            foreach (var property in modelBuilder.Model.GetEntityTypes()
                .SelectMany(t => t.GetProperties())
                .Where(p => p.ClrType == typeof(string)))
            {
                if (property.GetMaxLength().HasValue) continue;
                property.SetMaxLength(256);
                property.SetIsFixedLength(false);//false映射为nvarchar，true映射为nchar

            }
        }
    }
}
